package cadenaDeSucursales;

import java.util.ArrayList;
import java.util.List;

import clientes.Cliente;
import exceptions.ClienteNoEncontradoException;
import ofertas.Oferta;
import productosYPresentaciones.Producto;
import sucursal.Sucursal;

/**
 * Clase que representa la cadena de sucursales.
 * @author Stefania
 *
 */

public class CadenaSucursales {

	List<Oferta>ofertasVigentes;
	List<Sucursal> sucursales;
	List<Cliente> clientes;
	List<Cliente> clientesSubscriptos;
	
	public CadenaSucursales(List<Sucursal> sucursales) {

		this.ofertasVigentes= new ArrayList<Oferta>();
		this.sucursales = sucursales;
		this.clientes= new ArrayList<Cliente>();
		this.clientesSubscriptos= new ArrayList<Cliente>();
	}
	
	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public List<Cliente> getClientesSubscriptos() {
		return clientesSubscriptos;
	}

	public void setClientesSubscriptos(List<Cliente> clientesSubscriptos) {
		this.clientesSubscriptos = clientesSubscriptos;
	}

	public List<Oferta> getOfertasVigentes() {
		return ofertasVigentes;
	}
	public void setOfertasVigentes(List<Oferta> ofertasVigentes) {
		this.ofertasVigentes = ofertasVigentes;
	}
	public List<Sucursal> getSucursales() {
		return sucursales;
	}
	public void setSucursales(List<Sucursal> sucursales) {
		this.sucursales = sucursales;
	}
	
	//Mensajes que son del uml
	
	/**
	 * Agrega una sucursal a la cadena de sucursales
	 * @param s: sucursal a agregar.
	 */
	
	public void agregarSucursal(Sucursal s){
		this.getSucursales().add(s);
	}
	
	/**
	 * Agrega un cliente al sistema
	 * @param c: cliente a agregar.
	 */
	
	public void agregarCliente(Cliente c){
		this.getClientes().add(c);
	}
	
	/**
	 * Busca un cliente en la lista de clientes
	 * mediante el par�metro pasado.
	 * @param dni
	 * @return el Cliente buscado
	 */
	
	public Cliente buscarCliente(String dni)throws ClienteNoEncontradoException{
		
		Cliente c= this.getClientes().get(0);
		for(Cliente buscado: this.getClientes()){
			if(buscado.getDni()==dni){
				c=buscado;
			}
		}
		return c;
	}
	
	/**
	 * Busca una sucursal en la lista de sucursales
	 * mediante el par�metro pasado.
	 * @param s
	 * @return la Sucursal buscada.
	 */
	
	public Sucursal obtenerSucursal (String s){
		
		Sucursal laBuscada= this.getSucursales().get(0);
		for(Sucursal buscada: this.getSucursales()){
			if(buscada.getNombre()==s){
				laBuscada= buscada;
			}
		}
		return laBuscada;
		
	}
	
	/**
	 * Retorna el stock de un determinado producto de todas las sucursales.
	 * @param p
	 * @return
	 */
	
	public int getCantStockSucursales(Producto p){
		int stockProducto=0;
		for(Sucursal s: this.getSucursales()){
			stockProducto+= s.getCantStockProducto(p);
		}
		return stockProducto;
	}
	
	
	/**
	 * Se agrega un cliente a la lista de clientes subscriptos.
	 * Se implementa el patr�n Observer.
	 * @param c
	 */
	
	public void agregarSubscriptor(Cliente c){
		
		this.getClientesSubscriptos().add(c);
		
	}
	
	
	/**
	 * Se le notifica a los clientes subscriptos que hay una nueva oferta.
	 */
	
	public void notificarPorOfertas(Oferta o){
		
		for(Cliente c: this.getClientesSubscriptos()){
			c.recibirNotificacionOfertas(this,o);
		}
		
	}
	
	//// M�todo que me vi obligada a agregar...////
	
	/**
	 * Agrega una nueva oferta a la lista de ofertas vigentes.
	 * Se le notifica a los clientes subscriptos que hay una nueva oferta.
	 * @param o
	 */
	
	public void agregarOferta(Oferta o){
		this.getOfertasVigentes().add(o);
		this.notificarPorOfertas(o);
	}
	
/***
 * 
 * @param p: el producto que se busca en alguna de las sucursales 
 * existentes en la lista de cadenas
 * @return
 */
	public boolean hayStockEnAlgunaSucursal(Producto p, int cant) {
		for(Sucursal s: this.getSucursales()){
			if(s.hayStockEnEstaSucursal(p,cant)){
				return true;
			}
		}
		return false;
	}
/**
 * 
 * @param elQueNecesito: el producto solicitado a la sucursal por medio 
 * de la cadena de sucursales.
 * @param sucursal: la sucursal que pide el producto.
 */	
	public void pedirProducto(Producto elQueNecesito, int cant,Sucursal sucursal) {
		List<Sucursal>sucursalesConStock= new ArrayList<Sucursal>();
		for(Sucursal s: this.getSucursales()){
			if(s.hayStockEnEstaSucursal(elQueNecesito,cant)){
				sucursalesConStock.add(s);
			}
		}
		Sucursal sucursalDeLaQueTraigoElStock= sucursalesConStock.get(0);
		sucursal.traerProducto(elQueNecesito,cant,sucursalDeLaQueTraigoElStock);		
	}
}
